package com.tanchengjin.admin.modules.blog.validations.annotation;

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;

@Documented
/**
 * @Target({ElementType.FIELD})注解是指定当前自定义注解可以使用在哪些地方，这里仅仅让他可以使用属性上。但还可以使用在更多的地方，比如说方法上、构造器上等等。
 *
 * ElementType.TYPE - 类，接口（包括注解类型）或枚举
 * ElementType.FIELD - 字段（包括枚举常量）
 * ElementType.METHOD - 方法
 * ElementType.PARAMETER - 参数
 * ElementType.CONSTRUCTOR - 构造函数
 * ElementType.LOCAL_VARIABLE - 局部变量
 * ElementType.ANNOTATION_TYPE -注解类型
 * ElementType.PACKAGE - 包
 * ElementType.TYPE_PARAMETER - 类型参数
 * ElementType.TYPE_USE - 使用类型
 */
@Target(value = {ElementType.FIELD})
/**
 * @Retention(RetentionPolicy.RUNTIME)指定当前注解保留到运行时。保留策略有下面三种：
 *
 * RetentionPolicy.SOURCE - 注解只保留在源文件，当Java文件编译成class文件的时候，注解被遗弃。
 * RetentionPolicy.CLASS - 注解被保留到class文件，但jvm加载class文件时候被遗弃，这是默认的生命周期。
 * RetentionPolicy.RUNTIME - 注解不仅被保存到class文件中，jvm加载class文件之后，仍然存在。
 */
@Retention(RetentionPolicy.RUNTIME)
/**
 * @Constraint(validatedBy = CaptchaValidator.class)指定了当前注解使用哪个校验类来进行校验。
 */
@Constraint(validatedBy = CaptchaValidator.class)
public @interface Captcha {

    String message() default "验证码错误";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}
